class LSTM(nn.Module):
    def __init__(self,vocab_size,hidden_dim,num_layers,embedding_dim,output_dim):
         super(LSTM, self).__init__()
         self.hidden_dim = hidden_dim # 隐层大小
          self.num_layers = num_layers # LSTM层数
         # 嵌入层,会对所有词形成一个连续型嵌入向量,
         # 该向量的维度为embedding_dim
         # 然后利用这个向量来表示该字,而不是用索引继续表示
         self.embeddings = nn.Embedding(vocab_size+1, embedding_dim) 
         # 定义LSTM层
         # 第一个参数为每个时间步的特征大小,这里就是每个字的维度
         # 第二个参数为隐层大小
         # 第三个参数为lstm的层数
        self.lstm = nn.LSTM(input_size=embedding_dim, # 10
                            hidden_size=hidden_dim, # 8
                            num_layers=num_layers, # 1
                           # batch_first=Flase(默认)
                           )
        # 利用全连接层将其映射为2维,即正反面的概率
        self.fc = nn.Linear(hidden_dim, output_dim)
    def forward(self, x):
        # 1.首先形成嵌入向量
        embeds = self.embeddings(x) 
        # 2.将嵌入向量导入lstm层
        output, _ = self.lstm(embeds)
        timestep, batch_size, hidden_dim = output.shape
        output = output.reshape(-1, hidden_dim)
        # 3.将其导入全连接层
         output = self.fc(output) 
       # output输出形状:(batch_size * timestep, 2)
        output = output.reshape(timestep, batch_size, -1) 
        return output[-1]  
        # 返回最后一个时间片的输出,维度为(batch_size, 2)
